package com.itheima.service.impl;

import com.alibaba.dubbo.config.annotation.Service;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.itheima.dao.RoleDao;
import com.itheima.entity.PageResult;
import com.itheima.pojo.CheckItem;
import com.itheima.pojo.Role;
import com.itheima.service.RoleService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Service(interfaceClass = RoleService.class)
@Transactional
public class RoleServiceImpl implements RoleService {

    //注入RoleDao
    @Autowired
    private RoleDao roleDao;

    /*
        分页查询所有角色
     */
    public PageResult pageQuery(Integer currentPage, Integer pageSize, String queryString) {
        PageHelper.startPage(currentPage, pageSize);
        //调用DAO层
        Page<Role> page = roleDao.selectByCondition(queryString);

        return new PageResult(page.getTotal(), page.getResult());
    }

    Integer role_id = null;
    //添加角色,并添加角色和权限关联数据
    public void addPerAndRole(Role role, Integer[] permissionIds) {
        //先添加角色,调用dao层
        roleDao.addRole(role);
        //再添加角色和权限关联的数据
        role_id = role.getId();
        //关联角色表和权限表
        setRoleAndPer(role_id, permissionIds);

    }

    //关联菜单和角色表
    public void addMenuAndRole(Role role, Integer[] menuIds) {
        //判断menuIds是否为空
        if (menuIds != null && menuIds.length > 0) {
            //遍历
            for (Integer menu_id : menuIds) {
                //创建map集合,用于存储角色和权限的id
                Map<String, Integer> map = new HashMap<>();
                //添加对应的值
                map.put("role_id", role_id);
                map.put("menu_id", menu_id);
                //调用DAO层
                roleDao.addMenuAndRole(map);
            }
        }
    }

    //根据角色id查询角色信息
    public Role findById(Integer roleId) {
        return roleDao.findById(roleId);
    }

    //根据角色id查询对应的权限id
    public Integer[] findPerIdByRoleId(Integer roleId) {
        return roleDao.findPerIdByRoleId(roleId);
    }

    //根据角色id查询对应的菜单id
    public Integer[] findMenuIdByRoleId(Integer roleId) {
        return roleDao.findMenuIdByRoleId(roleId);
    }

    //修改角色,修改角色和权限关联的表
    public void editPerAndRole(Role role, Integer[] permissionIds) {
        //获取角色id
        Integer role_id = role.getId();
        //修改当前的角色表单数据
        roleDao.editFormData(role);
        //删除当前角色和权限关联的内容
        roleDao.deleteAssociatedInfo(role_id);
        //关联现在的角色表和权限表
        setRoleAndPer(role_id, permissionIds);
    }

    //修改角色和菜单关联的表
    public void editMenuAndRole(Integer role_id, Integer[] menuIds) {
        //删除当前角色和菜单关联的内容
        roleDao.deleteAssociatedRoleAndMenu(role_id);
        //遍历数组
        for (Integer menu_id : menuIds) {
            //创建map集合,用于存储角色和权限的id
            Map<String, Integer> map = new HashMap<>();
            //添加对应的值
            map.put("role_id", role_id);
            map.put("menu_id", menu_id);
            //调用DAO层
            roleDao.setRoleAndMenu(map);
        }
    }

    //删除角色
    public void delete(Integer role_id) {
        //先获取角色和权限关联的信息
        Integer[] perIs = roleDao.findPerIdByRoleId(role_id);
        if (perIs != null) {
            //删除现在的关联信息
            roleDao.deleteAssociatedInfo(role_id);
        }
        //获取角色和菜单关联的信息
        Integer[] menuIds = roleDao.findMenuIdByRoleId(role_id);
        if (menuIds != null) {
            //删除现在的关联信息
            roleDao.deleteAssociatedRoleAndMenu(role_id);
        }
        //执行到这,说明角色关联的信息都删除完毕,接着删除角色
        roleDao.deleteRoleById(role_id);
    }

    @Override
    public List<Role> findAll() {
        return null;
    }

    //关联角色表和权限表
    private void setRoleAndPer(Integer role_id, Integer[] permissionIds) {
        //判断permissionIds是否为空
        if (permissionIds != null && permissionIds.length > 0) {
            //遍历
            for (Integer permission_id : permissionIds) {
                //创建map集合,用于存储角色和权限的id
                Map<String, Integer> map = new HashMap<>();
                //添加对应的值
                map.put("role_id", role_id);
                map.put("permission_id", permission_id);
                //调用DAO层
                roleDao.setRoleAndPer(map);
            }
        }
    }
}
